home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / x11 / networke / xfirepow.000 / xfirepow / xfirepower-0.84 / client / defaults.c < prev    next >
C/C++ Source or Header  |  1995-06-15  |  4KB  |  198 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "data.h"
  5.  
  6. #define DEF_BOOL 1
  7. #define DEF_STRING 2
  8. #define DEF_INT 3
  9.  
  10. struct def {
  11.     char *name;
  12.     int type;
  13.     void *var;
  14.     char *help;
  15. };
  16.  
  17. char keymap[256];
  18.  
  19. struct def defs[] = {
  20.     {"namesOnTanks", DEF_BOOL, &namesOnTanks, "Whether to show player names or just numbers on tanks"},
  21.     {"showBuildMarker", DEF_BOOL, &showBuildMarker, "Show where a road or wall will be built"},
  22.     {"splitWindows", DEF_BOOL, &splitWindows, "Use three message windows instead of one"},
  23.     {"server", DEF_STRING, &server, "Server to connect to (if not given on command line)"},
  24.     {"port", DEF_INT, &port, "Port to connect to (if not given on command line)"},
  25.     {"name", DEF_STRING, &name, "Character name to use (if not given on command line)"},
  26.     {"keymap", DEF_STRING, keymap, "Remap keyboard.  Format : <new_char><old_char><new_char><old_char>..."},
  27. };
  28.  
  29. #define NUMDEFS (sizeof(defs)/sizeof(struct def))
  30.  
  31. char *expand_filename(char *fn)
  32. {
  33.     char *home, *expfn;
  34.  
  35.     if(strncmp(fn, "~/", 2))
  36.     return strdup(fn);
  37.  
  38.     if(!(home = getenv("HOME")))
  39.     home = ".";
  40.     
  41.     expfn = malloc(strlen(home) + strlen(fn) + 2);
  42.     
  43.     sprintf(expfn, "%s/%s", home, &fn[2]);
  44.     return expfn;
  45. }
  46.     
  47. void init_keymap()
  48. {
  49.     int i;
  50.  
  51.     for(i=0; i<256; i++)
  52.     keymap[i]=i;
  53. }
  54.  
  55. void add_keymap(char *map)
  56. {
  57.     char *k;
  58.  
  59.     for(k = map; k < map+strlen(map); k+=2)
  60.     if(*(k+1)) /* don't remap if at the end of the map string */
  61.         keymap[(int)*k] = *(k+1);
  62. }
  63.  
  64. char do_keymap(char k)
  65. {
  66.     return keymap[(int)k];
  67. }
  68.  
  69. void do_default(char *name, char *val)
  70. {
  71.     int i;
  72.     
  73.     if(!strcasecmp(name, "keymap")) {
  74.     add_keymap(val);
  75.     return;
  76.     }
  77.  
  78.     for(i=0; i<NUMDEFS; i++) {
  79.     if(!strcasecmp(name, defs[i].name)) {
  80.         switch(defs[i].type) {
  81.           case DEF_BOOL:
  82.         if((strncasecmp(val, "on", 2) == 0) || 
  83.            (strncasecmp(val, "1", 1)==0) || 
  84.            (strncasecmp(val, "true", 4)==0))
  85.             *((int *)defs[i].var) = 1;
  86.         else
  87.             *((int *)defs[i].var) = 0;
  88.         break;
  89.           case DEF_INT:
  90.         *((int *)defs[i].var) = atoi(val);
  91.         break;
  92.           case DEF_STRING:
  93.         *((char **)defs[i].var) = strdup(val);
  94.         break;
  95.           default:
  96.         printf("uhh, what?\n");
  97.         break;
  98.         }
  99.         continue;
  100.     }
  101.     }
  102. }
  103.  
  104. void write_defaults(char *fn)
  105. {
  106.     FILE *df;
  107.     int i, k;
  108.  
  109.     if(!(df= fopen(fn, "w"))) {
  110.     printf("Couldn't open \"%s\" for writing\n", fn);
  111.     return;
  112.     }
  113.  
  114.     for(i=0;i<NUMDEFS;i++) {
  115.     fprintf(df, "# %s\n", defs[i].help);
  116.     if(strcmp(defs[i].name, "keymap") == 0) {
  117.         fprintf(df, "keymap: %c%c", 1, 1); /* the two chars at the beginning are in case
  118.                           the first entry happens to be remapping
  119.                           space to something(very likely!) */
  120.         for(k=0;k<256;k++) {
  121.         if(keymap[k] != (char)k)
  122.             fprintf(df, "%c%c", k, keymap[k]);
  123.         }
  124.         fprintf(df, "\n");
  125.     } else {
  126.         fprintf(df, "%s: ", defs[i].name);
  127.         switch(defs[i].type) {
  128.           case DEF_BOOL:
  129.         fprintf(df, "%s\n", (*((int *)defs[i].var) ? "on" : "off"));
  130.         break;
  131.           case DEF_INT:
  132.         fprintf(df, "%d\n", *((int *)defs[i].var));
  133.         break;
  134.           case DEF_STRING:
  135.         fprintf(df, "%s\n", *((char **)defs[i].var));
  136.         break;
  137.           default:
  138.         fprintf(df, "\n");
  139.         break;
  140.         }
  141.     }
  142.     fprintf(df, "\n");
  143.     }
  144.     fclose(df);
  145. }
  146.  
  147. void read_defaults(char *filename)
  148. {
  149.     FILE *df;
  150.     char *expfilename, *junk;
  151.     char buf[1024];
  152.     char *s, *val;
  153.  
  154.     init_keymap();
  155.  
  156.     if(!filename)
  157.     filename = "~/.firepowerrc";
  158.     
  159.     expfilename = expand_filename(filename);
  160.  
  161.     if(!(df=fopen(expfilename, "r"))) {
  162.     if(strcmp(expfilename, (junk=expand_filename("~/.firepowerrc"))) == 0) {
  163.         free(junk);
  164.         printf("Creating defaults file \"%s\"\n", expfilename);
  165.         write_defaults(expfilename);
  166.         free(expfilename);
  167.         return;
  168.     }
  169.     printf("Couldn't open defaults file \"%s\"\n", expfilename);
  170.     free(expfilename);
  171.     return;
  172.     }
  173.  
  174.     while(!feof(df)) {
  175.     if(fgets(buf, 1023, df)) {
  176.         if(buf[0] == '#')
  177.         continue;
  178.         val = 0;
  179.         for(s=buf;s<buf+strlen(buf);s++)
  180.         if(*s == ':') {
  181.             *s = 0;
  182.             val = s+1;
  183.             break;
  184.         }
  185.         if(val) {
  186.         while((*val == ' ' || *val == '\t') && *val != 0)
  187.             val++;
  188.         val[strlen(val) - 1] = 0; /* get rid of newline */
  189.         if(val) {
  190.             do_default(buf, val);
  191.         }
  192.         }
  193.     }
  194.     }
  195.     fclose(df);
  196.     free(expfilename);
  197. }
  198.